package com.lili.collection.jdbc.utils;

import cn.hutool.core.map.MapUtil;
import com.lili.collection.jdbc.base.JDBCConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.regex.Pattern;

/**
 *描述: JDBC字符串工具
 *@date:2023/3/17  11:21
 *@author:lili
 */
@Slf4j
public class JdbcCharUtil {

    /**
     * 处理空字符串
     * @param value 原始值
     * @return
     */
    public static Object handleEmptyChar(Object value){
        if(value==null || ((value instanceof String) && StringUtils.isBlank((String)value))){
            return null;
        }else {
            return value;
        }
    }

    public static String getAliasName(Map<String,String> aliasMap,String columnName){
        try {
            if(MapUtil.isEmpty(aliasMap)){
                return columnName;
            }
            String aliasName = aliasMap.get(columnName);
            return StringUtils.isNotBlank(aliasName)?aliasName:columnName;
        } catch (Exception e) {
            return columnName;
        }
    }

    /**
     * 判断文件内容是否为 UTF-8 编码
     * @author
     */
    public static boolean isUTF8(byte[] bytes) {
        ByteArrayInputStream bais=null;
        try {
            bais=new ByteArrayInputStream(bytes);
            while (true) {
                int curr = bais.read();
                if (curr == -1) {
                    return true;
                }
                if (curr < 0x80) {
                } else if (curr < (0xC0)) {
                    return false;
                } else if (curr < (0xE0)) {
                    if ((bais.read() & (0xC0)) != 0x80) {
                        return false;
                    }
                } else if (curr < (0xF0)) {
                    if ((bais.read() & (0xC0)) != 0x80 || (bais.read() & (0xC0)) != 0x80) {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        } catch (Exception e) {
            log.error("判断文件编码失败!",e);
            return true;
        }finally {
            try {
                if(bais!=null){
                    bais.close();
                }
            } catch (IOException e) {
                log.error("关闭字节码流失败!",e);
            }
        }
    }

    /**
     * 获取当前时间的字符串格式
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getDateStr(){
        SimpleDateFormat format=new SimpleDateFormat(JDBCConstant.TIME_FORMAT);
        return format.format(new Date());
    }

    /**
     * 获取指定日期的时间字符串格式
     * @param date 日期类型
     * @return
     */
    public static String getDateStr(Date date){
        SimpleDateFormat format=new SimpleDateFormat(JDBCConstant.TIME_FORMAT);
        return format.format(date);
    }

    /**
     * 获取指定日期和格式的时间字符串格式
     * @param date 日期类型
     * @param pattern 日期时间格式
     * @return
     */
    public static String getDateStr(Date date,String pattern){
        SimpleDateFormat format=new SimpleDateFormat(pattern);
        return format.format(date);
    }

    /**
     * 有日期类型时进行转换为oracle能识别的格式
     * @param data
     * @return
     */
    public static Object dateTypeHandle(Object data){
        if(data == null){
            return data;
        }
        if(!(data instanceof String)){
            return data;
        }
        String value=(String)data;
        if(value.indexOf("-")==-1){
            return data;
        }
        try{
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return new Timestamp(sdf.parse(value).getTime());
        }catch (ParseException e){
            return data;
        }
    }

    public static boolean isInt(Object str){
        if(!(str instanceof String)){
            return false;
        }
        return Pattern.compile("^-?[1-9]\\d*$").matcher((String)str).find();
    }

    public static boolean isDouble(Object str){
        if(!(str instanceof String)){
            return false;
        }
        return Pattern.compile("^-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)$").matcher((String)str).find();
    }

    /**
     * 获取异常堆栈信息
     * @param throwable
     * @return
     */
    public static String getStrErrorMessage(Throwable throwable){
        return throwable.toString();
    }
}